Interfaces

Las interfaces nos permiten escribir código más flexible y re-utilizable sin depender de tipos en específicos. En Go, las Interfaces definen el comportamiento de un objeto. A diferencia de Java, no usas la palabra implements. Si un struct tiene los métodos que pide la interfaz, la implementa automáticamente (Duck Typing).

"Si camina como pato y grazna como pato, entonces es un pato".


1. Definición de una Interfaz

Una interfaz solo contiene las firmas de los métodos (nombre, parámetros y retorno).

type Mensajero interface {
    Enviar(mensaje string) error
}

2. Implementación Implícita

No necesitas decir nada en el struct. Solo crea el método con el mismo nombre y firma.

type Email struct {
    Direccion string
}

// Email implementa Mensajero automáticamente por tener este método
func (e Email) Enviar(m string) error {
    fmt.Printf("Enviando Email a %s: %s\n", e.Direccion, m)
    return nil
}

type SMS struct {
    Numero string
}

// SMS también implementa Mensajero
func (s SMS) Enviar(m string) error {
    fmt.Printf("Enviando SMS al %s: %s\n", s.Numero, m)
    return nil
}

3. El Poder del Polimorfismo

Puedes crear funciones que reciban la interfaz, y así aceptarán cualquier struct que la cumpla. Esto permite desacoplar el código.

func Notificar(m Mensajero, texto string) {
    m.Enviar(texto)
}

func main() {
    e := Email{Direccion: "miguel@go.dev"}
    s := SMS{Numero: "+58412000"}

    // La función acepta ambos porque ambos son 'Mensajeros'
    Notificar(e, "¡Hola desde Go!")
    Notificar(s, "¡Hola desde Go!")
}

4. La Interfaz Vacía (interface{} o any)

Una interfaz sin métodos es cumplida por absolutamente todo. Es el equivalente a Object en Java, pero en Go moderno (1.18+) usamos el alias any.

func Describir(i any) {
    fmt.Printf("Valor: %v, Tipo: %T\n", i, i)
}

⚠️ Nota: No abuses de any, pierde la seguridad del tipado.


💡 Diferencias Clave con Java

CaracterísticaJavaGo
VínculoExplícito (implements)Implícito (Automático)
ContratoRígidoFlexible (Desacoplado)
DiseñoInterfaces grandesInterfaces pequeñas (1 o 2 métodos)